/**
量词元字符：设置出现的次数
* 零到多次
+ 一到多次
? 零次或一次
{n} 出现n次
{n,m} 出现n到m次


特殊元字符：单个或者组合在一起代表特殊含义
\ 转义字符 (普通->特殊->普通)
. 除\n（换行符号）以外的任意字符
^ 以哪个元字符作为开始
? 匹配前面的子表达式零次或一次。例如，“do(es)?”可以匹配“do”或“does”。?等价于{0,1}。
$ 以哪个元字符作为结束
\n 换行符号
\d 0-9之间的数字
\D 非0-9的数字
\w 数字、字母、下划线中任意一个字符
\s 一个空白字符（包括空格、制表符、换页符等等）
\t 一个制表符（一个TAB键，4个空格）
x|y x或者y中的一个字符
[xyz] x或者y或者z中的一个字符
[^xy] 除了x/y以外的任意字符
[a-z]指定a-这个范围中的任意字符[0-9a-zA-Z]
[^a-z]除了a-z以外的
() 正则中的分组符号
(?:)只匹配不捕获
(?=)正向预查
(?!)负向预查
\b 匹配一个单词的边界，也就是指单词和空格间的位置
 （即正则表达式的“匹配”有两种概念，一种是匹配字符，一种是匹配位置，这里的\b就是匹配位置的）。


正则表达式常用的修饰符
i 忽略单词大小写
m 可以多行进行匹配
g 全局匹配

 */




//字面量创建方式
let reg1 = /\d+/g;

//构造函数模式创建 两个参数：元字符，修饰字符串
let reg2 = new RegExp('\\d+','g');

//如果正则中包含某个变量值，则不能使用字面量方式创建

var type = "es6"
var reg3 = new RegExp("^@"+type +"$")
console.log("reg3:",reg3.test("@es6"))



/*
验证数字
规则分析
1、可能出现+ - 号，也可能不出现  [+-]
2、一位0-9都有可能，多为首位不能是0  (\d|([1-9]\d+))
3、小数部分可能有可能没有，一旦有后面必须有
    小数点+数字 (\.\d+)
*/

function checkNumber(number) {
    var reg=/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;   /*定义验证表达式*/
    return reg.test(number);     /*进行验证*/
}

console.log("checkNumber:",checkNumber(123));


/*
验证密码
数字、字母、下划线、6~16位
必须以字母或者数字开头
 */
function checkPassword(str) {
    var reg=/^[0-9a-zA-Z](\w{6,16})$/;   /*定义验证表达式*/
    return reg.test(str);     /*进行验证*/
}

console.log("checkPassword:",checkPassword('a12_345'));



/*校验是否中文名称组成 */
function checkChina(str) {
    var reg=/^[\u4E00-\u9FA5]{2,4}$/;   /*定义验证表达式*/
    return reg.test(str);     /*进行验证*/
}

console.log('checkChina: ',checkChina('王昭君'));





/**
验证邮箱
邮箱由“数字、字母、下划线、-、.”几部分组分，
但是“-”和“.”不能连续出现，也不能作为开始

开头是数字字母（1位到多为），也可以是-数字字母下划线 或者 .数字字母下划线 整体零到多次


@[A-Za-z0-9]+
@后面跟着：数字、字母（1-多位）

((\.|-)[A-Za-z0-9]+)*
@xxx.com

\.[A-Za-z0-9]+
最后的域名（.com/.cn/,org/.edu/.net。。。。）
 */

function checkEmail(str){
    var reg = /^\w+((-\w)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/
    return reg.test(str);
}
console.log('checkEmail: ',checkEmail('100@qq.com.cn'));

/**
验证身份证号码
第二代身份证18位
编码规则顺序从左至右依次为6位数字地址码，8位数字出生年份日期码，3位数字顺序码，1位数字校验码（可为x）。
前六位：省市县
中间八位：年月日
最后四位是：
    倒数第二位 偶数是女 奇数是男
    最后一位是X或者数字
    其余是经过算法算出来

[1-9]\d{5}   前六位地区，非0打头    
(18|19|([23]\d))\d{2}      出身年份，覆盖范围为 1800-3999 年
((0[1-9])|(10|11|12))   月份，01-12月
(([0-2][1-9])|10|20|30|31)  日期，01-31天     闰年不能禁止29+
\d{3}[0-9Xx]：              顺序码三位 + 一位校验码
 */

function checkIdNo(str){
    var reg = /^([1-9]\d{5})(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
    return reg.test(str)
}

console.log('checkIdCode: ',checkIdNo('4409811993091572418'))



function checkTest(str){
    var reg = /\b(\w+)\s+\b/
    return reg.test(str);
}

console.log('checkTest: ',checkTest('ab  cdjifd dc dsv'));


